package com.tzx.fluttermixedapplication.activity

import android.content.Intent
import android.os.Bundle
import io.flutter.FlutterInjector
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

class BaseFlutterFragmentActivity : FlutterFragmentActivity() {
    companion object {
        const val JUMP_NATIVE_CHANNEL = "JUMP_NATIVE_CHANNEL"

        const val JUMP_NATIVE_CHANNEL_START_ACTIVITY_METHOD = "startActivity"

        const val FLUTTER_CHANNEL = "FLUTTER_CHANNEL"

        const val FLUTTER_METHOD = "CALL_FLUTTER"

        var GlobalFlutterEngine: FlutterEngine? = null
    }
    private lateinit var flutterMethodChannel: MethodChannel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GlobalFlutterEngine ?: kotlin.run {
            GlobalFlutterEngine = FlutterEngine(this)
            GlobalFlutterEngine?.let {
                // DartEntrypoint 是一个类，用于定义 Dart 程序的入口点（entry point）。
                // 在 Flutter 中，Dart 程序的入口点通常是 main() 函数，但是可以自定义其他入口点用于不同的模块或功能。
                // DartEntrypoint 允许你指定哪个 Dart 文件和函数应该作为 Flutter 引擎的入口点来执行。
                 val dartEntrypoint = DartEntrypoint.createDefault()
                // 指定运行那个Dart文件---->失败
                // val dartEntrypoint2 = DartEntrypoint(FlutterInjector.instance().flutterLoader().findAppBundlePath(), "lib/main2.dart", "main2")
                // 指定运行那个函数作为Flutter引擎入口来执行---->成功；
                val dartEntrypoint2 = DartEntrypoint(FlutterInjector.instance().flutterLoader().findAppBundlePath(), "main2")
                // DartExecutor 是 Flutter 中的一个类，它负责在 Flutter 引擎中执行 Dart 代码。
                // DartExecutor 提供了 Dart 代码与平台（如 Android 或 iOS）之间的桥梁，允许 Flutter 与原生平台进行交互。
                //
                // 主要功能
                // 执行 Dart 代码：DartExecutor 启动 Dart 代码的执行，并管理 Dart 代码的生命周期。
                // 与 Dart 代码通信：通过 BinaryMessenger 接口，DartExecutor 可以与 Dart 代码进行双向通信，
                // 支持 MethodChannel、EventChannel 和 BasicMessageChannel 等消息传递机制。
                it.dartExecutor.executeDartEntrypoint(dartEntrypoint2)
                GeneratedPluginRegistrant.registerWith(it)
            }
        }
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterMethodChannel = MethodChannel(flutterEngine.dartExecutor, JUMP_NATIVE_CHANNEL)
        flutterMethodChannel.setMethodCallHandler { call, result ->
            when(call.method) {
                JUMP_NATIVE_CHANNEL_START_ACTIVITY_METHOD -> {
                    var cls: Class<*>? = null
                    try {
                        cls = Class.forName(call.arguments.toString())
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                    cls?.let {
                        startActivity(Intent(this@BaseFlutterFragmentActivity, it))
                    }
                    result.success("")
                    // Flutter 侧会捕获一个 PlatformException，包含错误代码、错误消息和附加细节。
                    // result.error("", "", "")
                    // Flutter 侧会捕获一个 MissingPluginException。
                    // result.notImplemented()
                }
            }
        }
    }
}